home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / source / src / basic / _basic_alg.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-16  |  1.5 KB  |  98 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  _basic_alg.c
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. #include <LEDA/basic_alg.h>
  16.  
  17. #define SWAP(a,b) { help = *a; *a = *b; *b = help; }
  18.  
  19.  
  20. int SELECT(int* l, int* r, int pos)
  21.   // compute element at position "pos" in sequence *l,...,*r
  22.   // expected running time: O(r-l)
  23.  
  24.   register int* i;
  25.   register int* k;
  26.   register int s;
  27.   register int help;
  28.  
  29.   while (l < r) 
  30.   { i = l+(r-l)/2;
  31.     if (*i > *r) SWAP(i,r);
  32.     SWAP(l,i);
  33.  
  34.     i = l;
  35.     k = r;
  36.     s = *l;
  37.  
  38.     for(;;)
  39.     { while (*(++i) < s);
  40.       while (*(--k) > s);
  41.       if (i<k) SWAP(i,k) else break;
  42.      }
  43.   
  44.     SWAP(l,k);
  45.   
  46.     int j =  k-l+1;
  47.     if (pos <= j) 
  48.        r = k;
  49.     else 
  50.        { l = k+1;
  51.          pos -= j;
  52.         }
  53.   }
  54.  
  55.   return *l;
  56. }
  57.  
  58.  
  59.  
  60. double SELECT(double* l, double* r, int pos)
  61.   register double* i;
  62.   register double* k;
  63.   register double s;
  64.   register double help;
  65.  
  66.   while (l < r) 
  67.   { i = l+(r-l)/2;
  68.     if (*i > *r) SWAP(i,r);
  69.     SWAP(l,i);
  70.  
  71.     i = l;
  72.     k = r;
  73.     s = *l;
  74.  
  75.     for(;;)
  76.     { while (*(++i) < s);
  77.       while (*(--k) > s);
  78.       if (i<k) SWAP(i,k) else break;
  79.      }
  80.   
  81.     SWAP(l,k);
  82.   
  83.     int j =  k-l+1;
  84.     if (pos <= j) 
  85.        r = k;
  86.     else 
  87.        { l = k+1;
  88.          pos -= j;
  89.         }
  90.   }
  91.  
  92.   return *l;
  93. }
  94.  
  95.